package com.hsurosy.domain.activity.service.armory;

import com.hsurosy.domain.activity.model.entity.ActivitySkuEntity;
import com.hsurosy.domain.activity.repository.IActivityRepository;
import com.hsurosy.types.common.Constants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * @Author Hsu琛君珩
 * @Date 2024-11-09 19:14
 * @Description 活动sku预热
 * @Version: v1.0.0
 */
@Slf4j
@Service
public class ActivityArmory implements IActivityArmory, IActivityDispatch {

    @Resource
    private IActivityRepository activityRepository; // 活动仓储

    /**
     * 根据活动ID预热活动SKU及相关信息
     *
     * @param activityId 活动ID，用于查询活动相关的SKU信息
     * @return 预热结果，返回 true 表示预热成功
     */
    @Override
    public boolean assembleActivitySkuByActivityId(Long activityId) {
        // 根据活动ID查询所有关联的SKU信息
        List<ActivitySkuEntity> activitySkuEntities = activityRepository.queryActivitySkuListByActivityId(activityId);

        // 遍历活动SKU信息列表
        for (ActivitySkuEntity activitySkuEntity : activitySkuEntities) {
            // 将SKU库存数据缓存到Redis
            cacheActivitySkuStockCount(activitySkuEntity.getSku(), activitySkuEntity.getStockCount());
            // 预热活动次数信息，将活动次数数据加载到缓存
            activityRepository.queryRaffleActivityCountByActivityCountId(activitySkuEntity.getActivityCountId());
        }

        // 预热活动信息，将活动基本数据加载到缓存
        activityRepository.queryRaffleActivityByActivityId(activityId);
        return true;
    }

    /**
     * 预热活动 SKU 的相关数据，包括库存和活动信息缓存
     *
     * @param sku 活动商品 SKU ID
     * @return 预热成功返回 true
     */
    @Override
    public boolean assembleActivitySku(Long sku) {
        // 获取活动 SKU 实体信息，包括库存和活动 ID
        ActivitySkuEntity activitySkuEntity = activityRepository.queryActivitySku(sku);

        // 缓存活动 SKU 库存数量
        cacheActivitySkuStockCount(sku, activitySkuEntity.getStockCountSurplus());

        // 预热活动信息，将活动数据加载到缓存
        activityRepository.queryRaffleActivityByActivityId(activitySkuEntity.getActivityId());

        // 预热活动次数信息，将活动次数数据加载到缓存
        activityRepository.queryRaffleActivityCountByActivityCountId(activitySkuEntity.getActivityCountId());

        return true;
    }

    /**
     * 缓存活动 SKU 库存数量
     *
     * @param sku 活动商品 SKU ID
     * @param stockCount 活动商品库存数量
     */
    private void cacheActivitySkuStockCount(Long sku, Integer stockCount) {
        // 生成缓存键，用于存储活动 SKU 库存
        String cacheKey = Constants.RedisKey.ACTIVITY_SKU_STOCK_COUNT_KEY + sku;
        // 将库存数量缓存到指定的缓存键下
        activityRepository.cacheActivitySkuStockCount(cacheKey, stockCount);
    }

    /**
     * 扣减活动 SKU 的库存数量
     *
     * @param sku 活动商品 SKU ID
     * @param endDateTime 活动结束时间
     * @return 扣减成功返回 true
     */
    @Override
    public boolean subtractionActivitySkuStock(Long sku, Date endDateTime) {
        // 生成缓存键，用于更新活动 SKU 库存
        String cacheKey = Constants.RedisKey.ACTIVITY_SKU_STOCK_COUNT_KEY + sku;
        // 调用仓储层方法扣减库存并返回操作结果
        return activityRepository.subtractionActivitySkuStock(sku, cacheKey, endDateTime);
    }

}
